package cn.wolfcode.trip.base.mapper;

import cn.wolfcode.trip.base.domain.User;
import cn.wolfcode.trip.base.query.QueryObject;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    int deleteByPrimaryKey(Long id);

    int insert(User record);

    User selectByPrimaryKey(Long id);

    List<User> selectAll();

    int updateByPrimaryKey(User record);

    User selectUserByEmailAndPassword(@Param("email") String email, @Param("password") String password);

    List<User> queryForList(QueryObject qo);

    /**
     * 通过用户id,查询关注数
     *
     * @param userId 用户id
     * @return 关注数
     */
    Long selectFollowNumsByUserId(Long userId);

    /**
     * 通过用户id查询粉丝数
     *
     * @param userId 用户id
     * @return 粉丝数
     */
    Long selectFansNumsByUserId(Long userId);

    /**
     * 添加一个关注关系
     *
     * @param masterUserId 被关注者
     * @param slaveUserId  关注者
     * @param state        状态,true 关注,false 取消关注
     */
    void insertAFollowRelation(@Param("masterUserId") Long masterUserId, @Param("slaveUserId") Long slaveUserId, @Param("state") boolean state);

    /**
     * 查询一条关注关系
     *
     * @param masterUserId 被关注者
     * @param slaveUserId  关注者
     * @return map结果
     */
    Map selectAFollowRelationById(@Param("masterUserId") Long masterUserId, @Param("slaveUserId") Long slaveUserId);

    /**
     * 更新一个关注状态
     *
     * @param masterUserId 被关注者
     * @param slaveUserId  关注者
     * @param state        关注状态
     */
    void updateAFollowRelation(@Param("masterUserId") Long masterUserId, @Param("slaveUserId") Long slaveUserId, @Param("state") boolean state);

    /**
     * 查询用户的 关注列表
     *
     * @param userId 用户id
     * @return userList集合
     */
    List<User> selectUserzFollowListByUserId(Long userId);

    /**
     * 通过用户id查询粉丝list
     *
     * @param userId 用户id
     * @return 粉丝list
     */
    List<User> selectUserzFansByUserId(Long userId);

    List<User> selectAllUserId();


    /**
     * 插入用户和游记的中间表,维持关系
     * @param userId 用户id
     * @param travelId 游记id
     * @param status 状态
     */
    void insertRelationWithTravelId(@Param("userId") Long userId, @Param("travelId") Long travelId, @Param("status") Long status);

    /**
     * 插入用户和攻略的中间表,维持关系
     * @param userId 用户id
     * @param strategyId 攻略id
     * @param status 状态
     */
    void insertRelationWithStrategyId(@Param("userId") Long userId, @Param("strategyId") Long strategyId, @Param("status") Long status);

    /**
     * 插入用户和日报的中间表,维持关系
     * @param userId 用户id
     * @param dailyId 日报id
     * @param status 状态
     */
    void insertRelationWithDailyId(@Param("userId") Long userId, @Param("dailyId") Long dailyId, @Param("status") Long status);
    /**
     * 破坏用户和游记之间的关系
     * @param userId 用户id
     * @param travelId 游记id
     */
    void deleteRelationWithTravelId(@Param("userId") Long userId, @Param("travelId") Long travelId);

    /**
     * 破坏用户和攻略之间的关系
     * @param userId 用户id
     * @param strategyId 攻略id
     */
    void deleteRelationWithStrategyId(@Param("userId") Long userId, @Param("strategyId") Long strategyId);

    /**
     * 破坏用户和日报之间的关系
     * @param userId 用户id
     * @param dailyId 日报id
     */
    void deleteRelationWithDailyId(@Param("userId") Long userId, @Param("dailyId") Long dailyId);
    User checkHead(String email);
}